const jwt = require('jsonwebtoken');
const expressJWT = require('express-jwt');
// 密钥
const secret = 'shoptoken';

// 生成token data是自定义信息，exp是传的过期时间
const createToken = (data, exp) => {
	let obj = {};
	obj.data = data ? data : null;
	obj.type = 'express-jwt';
	obj.ctime = new Date().getTime();  //token的创建时间
	
	// 用expiresIn就不用，直接设置过期时间
	exp = exp ? exp : 60*60*24*7; //设定的过期时间,不设置就默认1天 
	
	let token = 'Bearer ' + jwt.sign(obj, secret, { expiresIn: exp }); // 调用此方法生成
	return token;
}

// 验证，传入token
// const verifyToken = (token) => {
// 	var info = jwt.verify(token,secret, (error, res) => {
// 		var data = {};
// 		// 通过回调函数自定义返回信息，不然默认是创建token时传进去的obj和时间信息，这里加上状态码这些
// 		if (error) {
// 			data.code = 400;
// 			data.data = error;
// 			data.msg = 'token验证失败';
// 		} else {
// 			data.code = 200;
// 			data.data = res;
// 			// data.msg = 'token验证成功';
// 		}
// 		return data;
// 	})
	
// 	return info; // 就是我们修改后的data
// }

// 验证--放到最前面的use
const verifyToken = () => {
  return expressJWT({
    secret: secret,
    algorithms: ['HS256'], // 要加才能对
    // requestProperty:'auth',//自定义获取的信息位置，默认验证通过req.user获取token信息
    credentialsRequired: false //是否允许无token请求
  }).unless({
    path: ['/login','/wx/*' ] //除了这些地址，其他的URL都需要验证
  });
};

// 失败处理--放到最后一个app.use()
const errorToken = (err, req, res, next) => {
	let data = {};
  if (err.name === 'UnauthorizedError') { 
    //  这个需要根据自己的业务逻辑来处理（ 具体的err值 请看下面）
    data.msg = 'token已过期';
  } else if (err.name === 'JsonWebTokenError') {
		data.msg = '无效的token';
	}
	data.code = 400;
	data.error = err;
	res.send(data); //返回失败信息
};

module.exports = { createToken, verifyToken, errorToken };